package com.pe.pgn.clubpgn.dao.impl;

import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.hibernate.Criteria;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import com.pe.pgn.clubpgn.common.CLPConstantes;
import com.pe.pgn.clubpgn.dao.PeriodoProgramaDao;
import com.pe.pgn.clubpgn.dao.hibernate.GenericDaoHibernate;
import com.pe.pgn.clubpgn.domain.ClpbPeriodo;
import com.pe.pgn.clubpgn.domain.ClpbPrograma;
import com.pe.pgn.clubpgn.domain.ClprPeriodoPrograma;
import com.pe.pgn.clubpgn.webapp.util.CalendarUtil;

@Repository("periodoProgramaDao")
public class PeriodoProgramaDaoImpl extends GenericDaoHibernate<ClprPeriodoPrograma, Long> implements PeriodoProgramaDao{

private JdbcTemplate jdbcTemplate;
	
	@Autowired
	public void setDataSource(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}
	
	public PeriodoProgramaDaoImpl() {
		super(ClprPeriodoPrograma.class);
	}

	public List<Map<String, Object>> periodoliquidacionPorPrograma(
			Long idPrograma) {

		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" 	  pp.id ");
		query.append(" 	 ,bp.de_periodo			  as dePeriodo   ");
		query.append(" 	 ,pp.de_mail			  as deMail   	 ");
		query.append(" 	 ,to_char(cast(pp.da_fecha_inicio_liq as date), '"+CLPConstantes.DATE_PATTERN+"')  as daInicioLiq ");
		query.append("	 ,to_char(cast(pp.da_fecha_fin_liq 	  as date), '"+CLPConstantes.DATE_PATTERN+"')  as daFinLiq    ");
		query.append(" 	 ,to_char(cast(pp.da_fecha_aviso1 	  as date), '"+CLPConstantes.DATE_PATTERN+"')  as daAviso1    ");
		query.append("	 ,to_char(cast(pp.da_fecha_aviso2 	  as date), '"+CLPConstantes.DATE_PATTERN+"')  as daAviso2    ");
		query.append(" from clpr_periodo_programa pp ");
		query.append(" join clpb_periodo bp ");
		query.append(" 	on bp.id = pp.co_periodo ");
		query.append(" where ");
		query.append("  pp.co_programa = "+idPrograma);
		query.append(" 	and pp.st_periodo_programa = '"+CLPConstantes.ST_VERDADERO+"'");
		query.append(" order by pp.da_fecha_inicio_liq asc ");
		
		return jdbcTemplate.queryForList(query.toString()); 
	}

	@SuppressWarnings("unchecked")
	public List<ClpbPeriodo> finbPeriodos() {

		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" 	 id, ");
		query.append("   de_periodo as dePeriodo ");
		query.append(" from clpb_periodo  ");
		query.append(" where 1 = 1 ");
		
		return findListOfBeans(query.toString(), null, ClpbPeriodo.class);
	}

	@SuppressWarnings("unchecked")
	public ClpbPrograma finbPrograma(Long idPrograma) {

		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" 	 id, ");
		query.append("   de_programa as dePrograma ");
		query.append(" from clpb_programa  ");
		query.append(" where 1 = 1 ");
		query.append(" and id = ").append(idPrograma);
		
		List<ClpbPrograma> list = findListOfBeans(query.toString(), null, ClpbPrograma.class);
		return (ClpbPrograma)list.get(0);
	}

	public void eliminarPeriodoPrograma(Long id) {

		remove(id);
		getHibernateTemplate().flush();
	}

	public void saveOrUpdatePeriodoPrograma(ClprPeriodoPrograma clprPeriodoPrograma, ClpbPrograma clpbprograma) {

		int nuAviso1 = Integer.parseInt(clpbprograma.getNuAviso1().toString());
		int nuAviso2 = Integer.parseInt(clpbprograma.getNuAviso2().toString());
		Calendar daFechaFinLiq = clprPeriodoPrograma.getDaFechaFinLiq();
		
		Date date  = new Date(daFechaFinLiq.getTimeInMillis());
		Date date1 = CalendarUtil.restarDias(date, nuAviso1);
		Date date2 = CalendarUtil.restarDias(date, nuAviso2);
		
		Calendar daFechaAviso1 = Calendar.getInstance();
		daFechaAviso1.setTimeInMillis(date1.getTime());
		
		Calendar daFechaAviso2 = Calendar.getInstance();
		daFechaAviso2.setTimeInMillis(date2.getTime());
		
		clprPeriodoPrograma.setClpbPrograma(clpbprograma);
		clprPeriodoPrograma.setClpbPeriodo(clprPeriodoPrograma.getClpbPeriodo());
        clprPeriodoPrograma.setStPeriodoPrograma(true);
        clprPeriodoPrograma.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
        clprPeriodoPrograma.setDaFechaCreacion(Calendar.getInstance()); 
        clprPeriodoPrograma.setDaFechaAviso1(daFechaAviso1);
        clprPeriodoPrograma.setDaFechaAviso2(daFechaAviso2);
        
        getHibernateTemplate().saveOrUpdate(clprPeriodoPrograma);
        getHibernateTemplate().flush();
	}
	
	public boolean validarDescripcionPeriodoExiste(
			ClprPeriodoPrograma periodoprograma, ClpbPrograma clpbprograma) {

		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" count(id) ");
		query.append(" from clpr_periodo_programa ");
		query.append(" where 1 = 1 ");
		query.append(" and st_periodo_programa = '"+CLPConstantes.ST_VERDADERO+"' ");
		query.append(" and co_programa = ").append(clpbprograma.getId());
		query.append(" and co_periodo  = ").append(periodoprograma.getClpbPeriodo().getId());
		
		int conteo = jdbcTemplate.queryForInt(query.toString());
		
		if(conteo > 0){
			return true;
		}else{
			return false;
		}
	}

	public String validarNoTocarPeriodosExistentes(
			ClprPeriodoPrograma periodoprograma, ClpbPrograma clpbprograma) {

		String daFechaInicioLiq = CalendarUtil.calendarToString(
		CLPConstantes.FORMATO_FECHA_CLUB_PGN_SHORT, periodoprograma.getDaFechaInicioLiq());
		
		String daFechaFinLiq    = CalendarUtil.calendarToString(
		CLPConstantes.FORMATO_FECHA_CLUB_PGN_SHORT, periodoprograma.getDaFechaFinLiq());
		
		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" count(id) ");
		query.append(" from clpr_periodo_programa ");
		query.append(" where 1 = 1 ");
		query.append(" and st_periodo_programa = '"+CLPConstantes.ST_VERDADERO+"' ");
		query.append(" and co_programa = ").append(clpbprograma.getId());
		
		query.append(" and (");
		
		query.append(" (da_fecha_inicio_liq >= to_date('").append(daFechaInicioLiq).append("', '"+CLPConstantes.FORMATO_FECHA_CLUB_PGN_SHORT+"')");		
		query.append(" and da_fecha_fin_liq <= to_date('").append(daFechaFinLiq).append("', '"+CLPConstantes.FORMATO_FECHA_CLUB_PGN_SHORT+"'))");
		query.append(" 	 or ");
		query.append(" (da_fecha_inicio_liq    >= to_date('").append(daFechaInicioLiq).append("', '"+CLPConstantes.FORMATO_FECHA_CLUB_PGN_SHORT+"')");
		query.append(" and da_fecha_inicio_liq <= to_date('").append(daFechaFinLiq).append("', '"+CLPConstantes.FORMATO_FECHA_CLUB_PGN_SHORT+"')");
		query.append(" and da_fecha_fin_liq    >= to_date('").append(daFechaFinLiq).append("', '"+CLPConstantes.FORMATO_FECHA_CLUB_PGN_SHORT+"'))");
		query.append(" 	 or ");
		query.append(" (da_fecha_inicio_liq <= to_date('").append(daFechaInicioLiq).append("', '"+CLPConstantes.FORMATO_FECHA_CLUB_PGN_SHORT+"')");
		query.append(" and da_fecha_fin_liq >= to_date('").append(daFechaInicioLiq).append("', '"+CLPConstantes.FORMATO_FECHA_CLUB_PGN_SHORT+"')");
		query.append(" and da_fecha_fin_liq <= to_date('").append(daFechaFinLiq).append("', '"+CLPConstantes.FORMATO_FECHA_CLUB_PGN_SHORT+"'))");
		
		query.append(" )");
		System.out.println("*** PeriodoProgramaDaoImpl.validarNoTocarPeriodosExistentes(): "+query.toString());
		int conteo = jdbcTemplate.queryForInt(query.toString());
		
		if(conteo > 0){
			//return false; //no es valido
			return query.toString();
		}else{
			//return true; // es valido
			return "";
		}
	}

	@SuppressWarnings("unchecked")
	public ClprPeriodoPrograma findPeriodoProgramaById(Long id) {

		Criteria criteria = DetachedCriteria.forClass(ClprPeriodoPrograma.class)
		.getExecutableCriteria(getSessionFactory().getCurrentSession());		
		criteria.add(Restrictions.eq("id", id));
	
		List<ClprPeriodoPrograma> lista = criteria.list();		
		ClprPeriodoPrograma clprPeriodoPrograma = lista.get(0);
		
		Calendar daFechaInicioVigencia = clprPeriodoPrograma.getDaFechaInicioLiq();
		Calendar daFechaFinVigencia = clprPeriodoPrograma.getDaFechaFinLiq();
		
		String desFechaInicioVigencia = CalendarUtil.calendarToString(CLPConstantes.DATE_PATTERN, daFechaInicioVigencia);
		String desFechaFinVigencia = CalendarUtil.calendarToString(CLPConstantes.DATE_PATTERN, daFechaFinVigencia);
		
		clprPeriodoPrograma.setDesFechaInicioLiq(desFechaInicioVigencia);
		clprPeriodoPrograma.setDesFechaFinLiq(desFechaFinVigencia);
		return clprPeriodoPrograma;
	}
}
